:art: get_group_share_info_integral

huangqimin001 4 years ago
parent
commit
68272ef8f9
3 changed files with 17 additions and 11 deletions
  1. 11 6
      api/member_views.py
  2. 1 1
      member/admin.py
  3. 5 4
      member/models.py

+ 11 - 6
api/member_views.py

@@ -4,6 +4,7 @@ from __future__ import division
4 4
 
5 5
 from django.conf import settings
6 6
 from django.db import transaction
7
+from django.db.models import Sum
7 8
 from django_logit import logit
8 9
 from django_query import get_query_value
9 10
 from django_response import response
@@ -425,16 +426,20 @@ def activity_signin(request):
425 426
     })
426 427
 
427 428
 
428
-def get_group_share_info_integral(share_user_id, open_gid, group_share_integral):
429
+def get_group_share_info_integral(activity_id, share_user_id, open_gid, group_share_integral, group_share_max_integral):
429 430
     # 校验该分享人是否已领取该群积分
430
-    has_integral = MemberActivityGroupShareInfo.objects.filter(share_user_id=share_user_id, open_gid=open_gid, is_integral=True).exists()
431
+    has_integral = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, share_user_id=share_user_id, open_gid=open_gid, is_integral=True).exists()
431 432
     if has_integral:
432 433
         return False, 0
433
-    # TODO: 其他限制条件
434
+    # 校验该分享人是否已领取该活动积分上限
435
+    total_integral = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, share_user_id=share_user_id).aggregate(Sum('integral')).get('integral__sum', 0) or 0
436
+    if total_integral + group_share_integral > group_share_max_integral:
437
+        return False, 0
434 438
     return True, group_share_integral
435 439
 
436 440
 
437 441
 @logit
442
+@transaction.atomic
438 443
 def activity_group_share(request):
439 444
     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
440 445
     share_user_id = request.POST.get('share_user_id', '')
@@ -460,12 +465,12 @@ def activity_group_share(request):
460 465
         return response()
461 466
 
462 467
     try:
463
-        act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
468
+        act = MemberActivityInfo.objects.select_for_update().get(activity_id=activity_id, status=True)
464 469
     except MemberActivityInfo.DoesNotExist:
465 470
         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
466 471
 
467 472
     # 判断是否给积分 & 给多少积分
468
-    is_integral, integral = get_group_share_info_integral(share_user_id, open_gid, act.group_share_integral)
473
+    is_integral, integral = get_group_share_info_integral(act.activity_id, share_user_id, open_gid, act.group_share_integral, act.group_share_max_integral)
469 474
 
470 475
     MemberActivityGroupShareInfo.objects.create(**{
471 476
         'brand_id': act.brand_id,
@@ -479,4 +484,4 @@ def activity_group_share(request):
479 484
         'integral': integral,
480 485
     })
481 486
 
482
-    return response(data={})
487
+    return response()

+ 1 - 1
member/admin.py

@@ -63,7 +63,7 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin):
63 63
 
64 64
 
65 65
 class MemberActivityGroupShareInfoAdmin(admin.ModelAdmin):
66
-    list_display = ('group_share_id', 'share_user_id', 'click_user_id', 'open_gid', 'activity_id', 'title', 'is_integral', 'integral', 'status', 'created_at', 'updated_at')
66
+    list_display = ('group_share_id', 'activity_id', 'share_user_id', 'click_user_id', 'open_gid', 'title', 'is_integral', 'integral', 'status', 'created_at', 'updated_at')
67 67
     list_filter = ('is_integral', 'status')
68 68
 
69 69
 

+ 5 - 4
member/models.py

@@ -298,6 +298,7 @@ class MemberActivityInfo(BaseModelMixin):
298 298
 
299 299
     integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分')
300 300
     group_share_integral = models.IntegerField(_(u'group_share_integral'), default=0, help_text=u'群组分享会员积分')
301
+    group_share_max_integral = models.IntegerField(_(u'group_share_max_integral'), default=0, help_text=u'群组分享会员积分单人上限')
301 302
 
302 303
     image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动内容图片')
303 304
 
@@ -311,10 +312,10 @@ class MemberActivityInfo(BaseModelMixin):
311 312
     share_img_link = models.CharField(_(u'share_img_link'), max_length=255, blank=True, null=True, help_text=u'活动图片分享')
312 313
     share_h5_link = models.CharField(_(u'share_h5_link'), max_length=255, blank=True, null=True, help_text=u'活动H5分享')
313 314
 
314
-    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
315
-
316 315
     is_signup = models.BooleanField(_(u'is_signup'), default=True, help_text=u'是否有报名功能')
317 316
 
317
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
318
+
318 319
     class Meta:
319 320
         verbose_name = _(u'会员活动信息')
320 321
         verbose_name_plural = _(u'会员活动信息')
@@ -462,13 +463,13 @@ class MemberActivityGroupShareInfo(BaseModelMixin):
462 463
 
463 464
     group_share_id = ShortUUIDField(_(u'group_share_id'), max_length=32, blank=True, null=True, help_text=u'活动群组分享唯一标识', db_index=True, unique=True)
464 465
 
466
+    activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
467
+
465 468
     share_user_id = models.CharField(_(u'share_user_id'), max_length=32, blank=True, null=True, help_text=u'分享用户唯一标识', db_index=True)
466 469
     click_user_id = models.CharField(_(u'click_user_id'), max_length=32, blank=True, null=True, help_text=u'点击用户唯一标识', db_index=True)
467 470
 
468 471
     open_gid = models.CharField(_(u'open_gid'), max_length=32, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
469 472
 
470
-    activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
471
-
472 473
     title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
473 474
 
474 475
     is_integral = models.BooleanField(_(u'is_integral'), default=False, help_text=u'是否有积分')